#include "Queue.h"

template<typename E>
JavaQueue<E>::JavaQueue(std::queue<E> *que) : queue(que) {
}

template<typename E>
JavaQueue<E>::~JavaQueue() {
    delete queue;
}

template<typename E>
bool JavaQueue<E>::empty() {
    return (*queue).empty();
}

template<typename E>
E JavaQueue<E>::peek() {
    return (*queue).front();
}

template<typename E>
E JavaQueue<E>::poll() {
    E frontElement = (*queue).front();
    (*queue).pop();
    return frontElement;
}

template<typename E>
void JavaQueue<E>::offer(const E &item) {
    (*queue).push(item);
}

template<typename E>
int JavaQueue<E>::search(const E &item) {
    int position = 1;
    std::queue<E> tempQueue = *queue;

    while (!tempQueue.empty()) {
        if (tempQueue.front() == item) {
            return position;
        }
        tempQueue.pop();
        position++;
    }

    return -1; // Object not found
}

template
class JavaQueue<int>; // Explicit instantiation for int

int JavaQueue_main() {
    JavaQueue<int> *queue = new JavaQueue<int>(new std::queue<int>());
    std::queue<int> *pQueue = new std::queue<int>();
    JavaQueue<int> queue2(pQueue);
    for (int i = 0; i < 8; ++i) {
        (*queue).offer(i);
        (queue2).offer(i);
    }

    int poll = queue2.poll();
    std::cout << "JavaQueue_main: poll = " << poll << std::endl;

    int peek = queue2.peek();
    std::cout << "JavaQueue_main: peek = " << peek << std::endl;

    int search = queue2.search(8);
    std::cout << "JavaQueue_main: search position = " << search << std::endl;

    static const bool test = false;
    if (test) {
        /* 因为JavaQueue的析构函数已经free了，所以这里不要再次对pQueue进行free，
         * 否则会free(): double free detected in tcache 2 */
        delete pQueue;
    }
    delete queue;
    return 0;
}